package br.com.gaspar.mb;

import gov.sefaz.framework.modelo.IBaseBO;
import gov.sefaz.utils.exception.BaseException;
import gov.sefaz.visao.jsf.ManagedBeanBase;

import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.event.AjaxBehaviorEvent;
import javax.faces.model.ListDataModel;
import javax.inject.Named;

import br.com.gaspar.bo.iface.IGasparBO;
import br.com.gaspar.entidade.Cliente;
import br.com.gaspar.entidade.SituacaoLancamento;
import br.com.gaspar.entidade.Venda;

@Named("VendaMB")
@SessionScoped
public class VendaMB extends ManagedBeanBase<Venda> {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@EJB
	private IGasparBO<Venda> bo;
	
	@EJB
	private IGasparBO<Cliente> clienteBO;
	
	private Boolean exibirNumero = false;
	
	private Boolean exibirLancamento = false;
	
	private SituacaoLancamento situacaoFiltro = null;
	
	private String situacaoFiltroStr;
	
	@Override
	protected IBaseBO<Venda> getFachada() {
		return bo;
	}

	@Override
	protected void criarAntes() throws BaseException {
		entidade = new Venda();
		setExibirNumero(false);
		super.criarAntes();
	}
	
	@PostConstruct
	@Override
	public void iniciar() {
		super.iniciar();
	}
	
	public List<Cliente> completeCliente(String query){
		List<Cliente> listaClientes = null;
		try {
			listaClientes = clienteBO.buscarTodosPorNamedQuery("Cliente.buscarPorNome", "%"+query+"%");
		} catch (BaseException e) {
			e.printStackTrace();
		} 
		return listaClientes;
	}

	public Boolean getExibirNumero() {
		return exibirNumero;
	}

	public void setExibirNumero(Boolean exibirNumero) {
		this.exibirNumero = exibirNumero;
	}
	
	@Override
	protected void editarAntes() throws BaseException {
		super.editarAntes();
		setExibirNumero(true);
		setEntidade(bo.buscarPorId(Venda.class, getEntidade().getId()));
		if(getEntidade().getSituacao().equals(SituacaoLancamento.A)){
			setExibirLancamento(true);
		}else{
			setExibirLancamento(false);
		}
	}
	
	public void calcularValorTotal(){
		Venda venda = getEntidade();
		venda.setValorTotal(venda.getValor().subtract(venda.getValorDesconto()));
	}
	
	@Override
	public String listar() {
		try {
			listarAntes();

			String namedQuery = ".buscarTodosPorSituacao";
			if(situacaoFiltroStr == null){
				situacaoFiltro = SituacaoLancamento.A;
			}else{
				situacaoFiltro = SituacaoLancamento.valueOf(getSituacaoFiltroStr());
			}
			entidades = getFachada().buscarTodosPorNamedQuery(getEntidade().getClass().getSimpleName() + namedQuery, situacaoFiltro);
			
			lista = new ListDataModel<Venda>(entidades);
			
			listarApos();
		} catch (BaseException e) {
			adicionarMensagem(e.getDescricao(), FacesMessage.SEVERITY_ERROR);
		}
		
		return LISTAR;
	}

	public SituacaoLancamento getSituacaoFiltro() {
		return situacaoFiltro;
	}

	public void setSituacaoFiltro(SituacaoLancamento situacaoFiltro) {
		this.situacaoFiltro = situacaoFiltro;
	}
	
	public void listarPorSituacao(AjaxBehaviorEvent abe){
		listar();
	}

	public String getSituacaoFiltroStr() {
		return situacaoFiltroStr;
	}

	public void setSituacaoFiltroStr(String situacaoFiltroStr) {
		this.situacaoFiltroStr = situacaoFiltroStr;
	}

	public Boolean getExibirLancamento() {
		return exibirLancamento;
	}

	public void setExibirLancamento(Boolean exibirLancamento) {
		this.exibirLancamento = exibirLancamento;
	}
}
